﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 *  对象扩展方法类型。
 * 
 * 最后修改：2011-10-19
 * ************************************************************/
namespace Mozlite
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Collections.Specialized;
    using System.Web;

    /// <summary>
    /// 对象辅助类。
    /// </summary>
    public static class ObjectUtility
    {
        #region contentlength
        /// <summary>
        /// 获取格式化后的字符串。
        /// </summary>
        /// <param name="length">文档长度。</param>
        /// <param name="format">格式化字符串标识：TB,GB,MB,KB,FILE</param>
        /// <param name="digit">小数位数。</param>
        /// <returns>返回格式化后的字符串。</returns>
        public static string ToContentLengthString(this long length, string format = null, int digit = 3)
        {
            if (format != null)
                format = format.ToLower();
            if ((format == null || format == "tb") && length >= CommonHelper.TBytes)
                return string.Format("{0:f" + digit + "}T", length * 1.0 / CommonHelper.TBytes);
            if ((format == null || format == "gb") && length >= CommonHelper.GBytes)
                return string.Format("{0:f" + digit + "}G", length * 1.0 / CommonHelper.GBytes);
            if ((format == null || format == "mb") && length >= CommonHelper.MBytes)
                return string.Format("{0:f" + digit + "}M", length * 1.0 / CommonHelper.MBytes);
            if ((format == null || format == "kb") && length >= CommonHelper.KBytes)
                return string.Format("{0:f" + digit + "}K", length * 1.0 / CommonHelper.KBytes);
            return length + "B";
        }
        /// <summary>
        /// 获取格式化后的字符串。
        /// </summary>
        /// <param name="length">文档长度。</param>
        /// <param name="format">格式化字符串标识：TB,GB,MB,KB,FILE</param>
        /// <param name="digit">小数位数。</param>
        /// <returns>返回格式化后的字符串。</returns>
        public static string ToContentLengthString(this int length, string format = null, int digit = 3)
        {
            return ((long)length).ToContentLengthString(format, digit);
        }
        #endregion

        #region sqls
        /// <summary>
        /// 将SQL字符串中的“'”替换为“''”。
        /// </summary>
        /// <param name="sql">SQL字符串。</param>
        /// <returns>返回格式化后的字符串。</returns>
        public static string SQLEncode(this object sql)
        {
            if (sql == null)
                return "";
            return sql.ToString().Replace("'", "''");
        }
        /// <summary>
        /// 将后面跟有默认行终止符的指定字符串的副本追加到当前<see cref="T:System.Text.StringBuilder"/>对象的末尾。
        /// </summary>
        /// <param name="builder"><see cref="T:System.Text.StringBuilder"/>实例对象。</param>
        /// <param name="format">复合格式字符串。</param>
        /// <param name="args">要格式化的对象。</param>
        /// <returns>完成追加操作后对此实例的引用。</returns>
        public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args) {
            return builder.AppendLine(string.Format(format, args));
        }
        #endregion

        #region xml
        /// <summary>
        /// 获取节点内的字符串。
        /// </summary>
        /// <param name="node">节点实例对象。</param>
        /// <param name="defaultValue">如果不存在返回的字符串。</param>
        /// <param name="trim">是否去掉前后空格。</param>
        /// <returns>返回节点内的字符串。</returns>
        public static string GetInnerText(this XmlNode node, string defaultValue = null, bool trim = true)
        {
            if (node == null)
                return defaultValue;
            string value = node.InnerText ?? defaultValue;
            if (trim && value != null)
                value = value.Trim();
            return value;
        }
        /// <summary>
        /// 获取XML节点的属性。
        /// </summary>
        /// <param name="node">节点对象。</param>
        /// <param name="name">节点名称。</param>
        /// <param name="defaultValue">默认值。</param>
        /// <returns>返回XML节点的属性。</returns>
        public static string GetAttribute(this XmlNode node, string name, string defaultValue = null)
        {
            XmlAttribute attribute = node.Attributes[name];
            if (attribute != null)
                return attribute.Value.Trim();
            return defaultValue;
        }
        #endregion

        #region urls
        /// <summary>
        /// 判断当前URL地址是否为同一域的名称。
        /// </summary>
        /// <param name="uri">URL地址。</param>
        /// <param name="domain">域名。</param>
        /// <returns>返回是否为同一域的域名。</returns>
        public static bool IsDomainOrSubDomain(this Uri uri, string domain)
        {
            if (uri == null || string.IsNullOrEmpty(domain))
                return false;
            return uri.DnsSafeHost.IsMatched(domain) || uri.DnsSafeHost.EndsWith("." + domain, StringComparison.OrdinalIgnoreCase);
        }
        #endregion

        #region temp
        /// <summary>
        /// 将上传的文件保存到临时文件夹中，并且返回临时文件夹中的物理路径。
        /// </summary>
        /// <param name="file">上传文件实例对象。</param>
        /// <returns>返回临时文件物理路径。</returns>
        public static string SaveAsTemp(this HttpPostedFile file)
        {
            string tempFile = CommonHelper.GetNewTempPath();
            file.SaveAs(tempFile);
            return tempFile;
        }
        /// <summary>
        /// 将上传的文件保存到临时文件夹中，并且返回临时文件夹中的物理路径。
        /// </summary>
        /// <param name="file">上传文件实例对象。</param>
        /// <returns>返回临时文件物理路径。</returns>
        public static string SaveAsTemp(this HttpPostedFileBase file)
        {
            string tempFile = CommonHelper.GetNewTempPath();
            file.SaveAs(tempFile);
            return tempFile;
        }
        #endregion

        #region object
        /// <summary>
        /// 获取实例类型名称，包括命名空间和类型名称以及程序集。
        /// </summary>
        /// <param name="obj">当前实例对象。</param>
        /// <returns>返回实例类型名称，包括命名空间和类型名称以及程序集。</returns>
        public static string GetInstanceType(this object obj) {
            return obj.GetType().GetInstanceType();
        }

        /// <summary>
        /// 获取实例类型名称，包括命名空间和类型名称以及程序集。
        /// </summary>
        /// <param name="type">当前实例类型。</param>
        /// <returns>返回实例类型名称，包括命名空间和类型名称以及程序集。</returns>
        public static string GetInstanceType(this Type type) { 
            return type.FullName + ", " + type.Assembly.GetName().Name;
        }

        /// <summary>
        /// 获取对象小写字符串。
        /// </summary>
        /// <param name="value">对象实例。</param>
        /// <param name="defaultValue">默认字符串。</param>
        /// <returns>返回小写字符串。</returns>
        public static string GetLowerString(this object value, string defaultValue = null)
        {
            if (value == null)
                return defaultValue;
            return value.ToString().ToLower();
        }

        /// <summary>
        /// 获取对象大写字符串。
        /// </summary>
        /// <param name="value">对象实例。</param>
        /// <param name="defaultValue">默认字符串。</param>
        /// <returns>返回大写字符串。</returns>
        public static string GetUpperString(this object value, string defaultValue = null)
        {
            if (value == null)
                return defaultValue;
            return value.ToString().ToUpper();
        }
        #endregion
    }
}
